package com.ruoyi.service;

import com.ruoyi.entity.CouponDto;
import com.ruoyi.order.domain.VerCoupon;

import java.math.BigDecimal;
import java.util.List;

public interface VerCouponsService {

    /**
     * 根据ID获取优惠券信息
     *
     * @param id 优惠券ID
     * @return 优惠券DTO对象
     * @throws Exception 当优惠券不存在时抛出异常
     */
    public CouponDto getCouponById(Long id);

    /**
     * 根据组ID获取优惠券列表
     *
     * @param groupId 优惠券组ID
     * @return 优惠券DTO对象列表
     */
    public List<CouponDto> getCouponsByGroupId(Long groupId);

    /**
     * 获取所有可用的优惠券
     *
     * @return 可用优惠券DTO对象列表
     */
    public List<CouponDto> getAvailableCoupons(VerCoupon verCoupon);

    /**
     * 创建新的优惠券
     *
     * @param coupon 优惠券对象
     * @return 创建成功的优惠券ID
     * @throws Exception 当创建优惠券失败时抛出异常
     */
    public Long createCoupon(VerCoupon coupon);

    /**
     * 更新优惠券信息
     *
     * @param coupon 待更新的优惠券对象
     * @return 更新是否成功
     */
    public boolean updateCoupon(VerCoupon coupon);

    /**
     * 删除优惠券
     *
     * @param id 待删除的优惠券ID
     * @return 删除是否成功
     */
    public boolean deleteCoupon(Long id);

    /**
     * 领取优惠券
     *
     * @param couponId 待领取的优惠券ID
     * @return 领取是否成功
     */
    public boolean receiveCoupon(Long couponId);

    /**
     * 使用优惠券
     *
     * @param couponId 优惠券ID
     * @param orderId 订单ID
     * @return 使用是否成功
     */
    public boolean useCoupon(Long couponId, Long orderId);

    /**
     * 关联SKU与优惠券
     *
     * @param couponId 优惠券ID
     * @param skuIds SKU ID列表
     * @return 关联是否成功
     */
    public boolean relateSkuWithCoupon(Long couponId, List<Long> skuIds);

    /**
     * 获取适用于指定SKU且满足订单金额要求的可用优惠券
     *
     * @param skuId SKU ID
     * @param orderAmount 订单金额
     * @return 可用优惠券DTO对象列表
     */
    public List<CouponDto> getUsableCouponsForSku(Long skuId, BigDecimal orderAmount);

    /**
     * 自动更新优惠券状态（定时任务调用）
     *
     * @return 更新是否成功
     */
    public boolean autoUpdateCouponStatus();

    /**
     * 删除SKU与优惠券的关联
     *
     * @param couponId 优惠券ID
     * @param skuIds SKU ID列表
     * @return 删除是否成功
     */
    public boolean removeSkuCouponRelation(Long couponId, List<Long> skuIds);
}
